/** @file scanner.h
 *  Tipo abstracto de datos que maneja un separador de tokens dado un string.
 *  Este ADT fue obtenido del libro Programming Abstractions in C de Eric Roberts.
 *  Pueden encontrar este ADT en las paginas 350 a la 355.
 */

#ifndef SCANNER_H_
#define SCANNER_H_

typedef struct scannerCDT * scannerADT;

/**
 *  Funcion: NewScanner
 *  Uso: scanner = NewScanner();
 * -----------------------------
 * Crea una nueva instancia del scanner.
 *
 */

scannerADT NewScanner( void );

/**
 *  Funcion: FreeScanner
 *  Uso: FreeScanner( scanner );
 * -----------------------------
 * Destruye la instancia del scanner.
 *
 */


void FreeScanner( scannerADT scanner );

/**
 *  Funcion: SetScannerString
 *  Uso: SetScannerString( scanner, str );
 * -----------------------------
 * Inicializa el string del que se obtendran las tokens
 *
 */

void SetScannerString( scannerADT scanner, char * str );

/**
 *  Funcion: ReadToken
 *  Uso: token = ReadToken( scanner );
 * -----------------------------
 * Retorna el proximo token
 *
 * @return El proximo token o NULL si no hay mas disponibles
 * @warning Retorna una copia del token. El usuario debe liberarla.
 */

char * ReadToken( scannerADT scanner );

/**
 *  Funcion: MoreTokensExist
 *  Uso: if(MoreTokensExist( scanner )...
 * -----------------------------
 * Retorna distinto de 0 en caso de que queden tokens por leer.
 */

int MoreTokensExist( scannerADT scanner );

/**
 *  Funcion: SaveToken
 *  Uso: SaveToken( scanner, token );
 * -----------------------------
 * Guarda el token en la estructura interna del ADT para que la proxima vez que sea llamada
 * ReadToken no se lea de la fuente original sino que se retorne el token entregado a SaveToken
 */

 void SaveToken( scannerADT scanner, char * token );

 /*
 * Funciones: SetScannerSpaceOption, GetScannerSpaceOption
 * Uso: SetScannerSpaceOption(scanner, option);
 *      option = GetScannerSpaceOption(scanner);
 * -----------------------------------------------
 * La funcion SetScannerSpaceOption controla si el scanner ignorara
 * los espacios en blanco. Por default los considera separadores tokens.
 * Pero, si se llama a:
 *
 *    SetScannerSpaceOption(scanner, IgnoreSpaces);
 *
 * El scanner salteara los espacios en blanco de una cadena.
 *
 *    SetScannerSpaceOption(scanner, PreserveSpaces);
 *
 * La funcion GetScannerSpaceOption retorna el estado actual de la opcion.
 */

 typedef enum { PreserveSpaces, IgnoreSpaces } spaceOptionT;

#endif /*SCANNER_H_*/
